//
//  SLUserViewModel.swift
//  Sina15
//
//  Created by 盼 on 16/4/10.
//  Copyright © 2016年 pan. All rights reserved.
//

import UIKit

private let userInfoKey = "cn.susie"

class SLUserViewModel: NSObject {
    
    //创建单例对象
   static let sharedModel:SLUserViewModel = SLUserViewModel()
    
    //为了避免加载页面判断登录的时候频繁读取磁盘，进行IO操作，创建一个用户模型对象，保存用户信息，这样判断的时候就不用频繁读取磁盘，可以从内存中获取
    var userAccount: SLUserAccount?
    
    //增加一个只读属性userLogin
    var userLogin: Bool {
        
        //如果用户token存在并且没有过期，登录
        if let u = userAccount where u.expire_date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
           
            return true
        }
        
        //如果token已经过期，把账户信息设置为nil
        userAccount = nil
        return false
    }
    
    //增加一个用户头像NSURL类型的属性
    var headImageURL: NSURL? {
        
        let url = NSURL(string: userAccount?.avatar_large ?? "")
        
        return url
    }
    
    //私有化构造方法,让单例对象称为真正的单例对象
    private override init() {
        super.init()
        userAccount = self.loadUserInfo()
    }

   }

//MARK:用户登录相关的网络请求
extension SLUserViewModel {
    
    func loadAccessToken(code: String,finished:(isSuccess: Bool)->()){
        
        AFNetWorkTool.sharedTools.loadAccessToken(code) { (response, error) -> () in
            
            if error != nil {
                print(error)

                finished(isSuccess: false)
                return
        }
            self.loadUserInfo(response!,finished: finished)
        }
    }
    
    //通过AccessToken加载用户信息
    func loadUserInfo(response: AnyObject,finished:(isSuccess: Bool)->()){
        
        //尝试把AnyObject转换成字典
        guard let dict = response as? [String: AnyObject] else {
            
            finished(isSuccess: false)
            
            return
        }
        
        //转成字典成功则获取请求用户信息需要用到的参数
        
        //        必选	类型及范围	说明
        //        access_token	true	string	采用OAuth授权方式为必填参数，OAuth授权后获得。
        //        uid	false	int64
        let access_token = dict["access_token"]
        let uid = dict["uid"]
        
        //请求用户信息的参数
        let parameters:[String: AnyObject] = ["access_token": access_token!,"uid": uid!]
        
//        let URLStr = "https://api.weibo.com/2/users/show.json"
        
        //请求用户信息
        AFNetWorkTool.sharedTools.loadUserInfo(parameters) { (response, error) -> () in
            if error != nil {
                
                print(error)
                finished(isSuccess: false)
                return
        }
        
//        //请求用户信息
//        AFNetWorkTool.sharedTools.request(.GET, URLStr: URLStr, parameters: parameters) { (response, error) -> () in
//            
//            if error != nil {
//                
//                print(error)
//                finished(isSuccess: false)
//                return
//            }
            
            
            //把用户信息转成字典
            guard var userInfoDict = response as? [String: AnyObject] else {
                
                finished(isSuccess: false)
                
                return
            }
            
            //把获取到的token和用户信息合并起来，保存到字典中
            for (key,value) in dict {
                
                userInfoDict[key] = value
            }
            
            //            //空键值对不能存到偏好设置中，
            //            userDefaults.setObject(userInfoDict, forKey: "userInfoKey")
            
            //把用户信息保存到沙盒
            self.saveUserInfo(userInfoDict)
            
            //执行成功的回调
            finished(isSuccess: true)
        }
        
    }

}


//MARK: IO操作读写数据
extension SLUserViewModel {
    
    //把用户信息保存到沙盒
    func saveUserInfo(dict: [String: AnyObject]){
        
        //字典转模型
        let userAccount = SLUserAccount(dict: dict)
        
        //给用户模型对象赋值,防止用户第一次登录的时候，沙盒中没有用户信息，要进入欢迎页面拿不到用户信息，所以，一旦登录就就保存用户信息
        self.userAccount = userAccount
        
        let userDefaults = NSUserDefaults.standardUserDefaults()
        
        //不能把普通OC对象直接保存到偏好设置中，因为偏好设置是plist文件，应该保存plist文件可以接收的数据类型，eg:NSArray,NSDictionary,所以如果要把普通的OC对象信息保存到偏好设置中，可以先转换成字典
        //            userDefaults.setObject(userAccount, forKey: "userInfoKey")
        
        //            let userAccountDict:[String: AnyObject] = ["access_token":userAccount.access_token!,"uid":userAccount.uid!,"expires_in":userAccount.expires_in,"name":userAccount.name!,"avatar_large":userAccount.avatar_large!]
        
        //获取模型对象的字典信息
        let keys = ["access_token","uid","expires_in","name","avatar_large"]
        
        let userAccountDict = userAccount.dictionaryWithValuesForKeys(keys)
        
        userDefaults.setObject(userAccountDict, forKey: userInfoKey)
        
//        let dict = NSUserDefaults.standardUserDefaults().objectForKey(userInfoKey)
        
        print(dict)
        
        userDefaults.synchronize()
        
    }
    
    //从沙盒中读取用户信息
    func loadUserInfo()->SLUserAccount?{
        
        //获取用户的字典信息
        //获取的dict是偏好设置字典对象中一个元素，是一个AnyObject对象，需要转换成［String: AnyObject］类型
        guard let dict = NSUserDefaults.standardUserDefaults().objectForKey(userInfoKey) as? [String: AnyObject] else {
            
            return nil
        }
        
        //把字典转成模型
        let userAccount = SLUserAccount(dict: dict)
        
        return userAccount
        
    }
}